#ifndef ENEMY_HH
#define ENEMY_HH

#include "Character.hh"

// Base enemy class, inheriting from Character class
class Enemy : public Character 
{
public:
    // Constructor calls the parent class constructor
    Enemy(const std::string& name, const std::string& description, unsigned health, unsigned attack, unsigned defense);
    Enemy(const Enemy& other) = default;
    Enemy& operator=(const Enemy& other) = default;
    virtual ~Enemy() = default;

    
    // Must implement special attack method, used for enemy special attacks
    virtual void specialAttack(ICharacter& target) = 0;
};

// Specific enemy type - Lava Hound
class Lava_Hound : public Enemy 
{
public:
    Lava_Hound();
    Lava_Hound(const Lava_Hound& other) = default;
    Lava_Hound& operator=(const Lava_Hound& other) = default;
    ~Lava_Hound() = default;
    void specialAttack(ICharacter& target) override;
};

// Specific enemy type - Bone King
class Bone_King : public Enemy 
{
public:
    Bone_King();
    Bone_King(const Bone_King& other) = default;
    Bone_King& operator=(const Bone_King& other) = default;
    ~Bone_King() = default;
    void specialAttack(ICharacter& target) override;
};

// Specific enemy type - Troll (Boss enemy)
class Troll : public Enemy 
{
public:
    Troll();
    Troll(const Troll& other) = default;
    Troll& operator=(const Troll& other) = default;
    ~Troll() = default;
    void specialAttack(ICharacter& target) override;
};

#endif
